package com.baizhi.mapper;

import com.baizhi.pojo.User;
import com.baizhi.to.UserTO;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 用户类的持久层接口
 */
public interface UserMapper {

    /**
     * 功能：获取所有用户信息
     * @return 返回用户列表
     */
    List<User> getUsers();

    /**
     * 演示：单个参数的传递
     * 功能：根据Id获取用户信息
     * @param id  前端用户输入的，用户Id，作为参数传递的
     * @return  满足条件返回用户信息，否则返回null
     */
    User getUserById(int id);

    /**
     * 功能：根据性别和地址查询用户信息
     * @param sex 用户的性别
     * @param address 用户地址
     * @return 若有满足条件的用户信息则返回用户列表，否则返回null
     *
     *  JDK 编译完成之后无论形参列表如何命名，都会改成以下形式
     *  List<User> getUserBySexAndAddress(String arg0,String arg1);
     *  或者
     *   List<User> getUserBySexAndAddress(String param1,String param2);
     *
     *   可以通过注解强制命名
     */
    List<User> getUserBySexAndAddress(@Param("sex") String sex, @Param("address") String address);

    /**
     *  测试：JavaBean作为参数
     *
     * 功能：根据性别和地址查询用户信息
     * @param user   用于封装判断条件
     * @return 若有满足条件的用户信息则返回用户列表，否则返回null
     *
     */
    List<User> getUserBySexAndAddress2(User user);


    /**
     * 测试：Map集合作为参数传递
     * 功能：根据性别和地址查询用户信息
     * @param map 用于封装条件
     * @return 若有满足条件的用户信息则返回用户列表，否则返回null
     */
    List<User> getUserBySexAndAddress3(Map<String,String> map);

    /**
     * 测试：TO对象作为参数传递
     * 功能：根据性别和地址查询用户信息
     * @param ut 用于封装条件
     * @return 若有满足条件的用户信息则返回用户列表，否则返回null
     */
    List<User> getUserBySexAndAddress4(UserTO ut);

    /**
     * 练习一：练习多个参数传递值
     * 需求：根据生日区间查询用户信息
     * @param minYear 最小的出生年份范围
     * @param maxYear 最大的出生年份范围
     * @return 返回满足条件的用户列表
     */
    List<User> getUsersByBirthdayBetween(@Param("minYear") int minYear,@Param("maxYear") int maxYear);


    /**
     * 练习三：练习Map作为参数传递值
     * 需求：根据生日区间查询用户信息
     * @param map  封装条件信息
     * @return 返回满足条件的用户列表
     */
    List<User> getUsersByBirthdayBetween2(Map<String,Integer> map);





    /**
     * 演示 List集合作为参数进行传递
     * 需求：根据Id列表查询用户信息
     * @param ids  Id列表
     * @return 返回满足条件的用户列表
     *
     * 编译之后 如果是集合参数形式如下 [arg0, collection, list]
     */
    List<User> getUsersByIds(@Param("ids") List<Integer> ids);


    /**
     * 演示 数组作为参数进行传递
     * 需求：根据Id列表查询用户信息
     * @param ids ID数组
     * @return 返回满足条件的用户列表
     *
     * 默认的参数名  [array, arg0]
     */
    List<User> getUsersByIds2(@Param("ids")int[] ids);

}
